#ifndef _TCOLAABBPORO_
#define _TCOLAABBPORO_

#include<iostream>
using namespace std;

#include"tabbporo.h"

/** \file  tcolaabbporo.h
 *  \brief Esta es una clase de apoyo basada en la propiedades y operaciones posibles con una cola de tporos.
 *
 *	Autor: Óscar Toledo Ballester, 48666364c.
 *      Autor: Alejandro Serrano Cases, 74364527f
 *	
 * 	Con esta clase podemos trabajar con un gran numero de operaciones posibles con una cola, con la particularidad de que nuestra cola sera de
 *      tporos. Está compuesta por dos clases: TECAP y TColaABBPoro, ambas declaradas entre ellas como amigas.
 *      Esta clase auxiliar sirve de apoyo a la clase TABBPoro	
 */


class TECAP;
class TColaABBPoro;

class TColaABBPoro
{
		friend class TECAP;
		friend class TABBPoro;
	private:
		// Puntero al primer elemento de la cola
		TECAP *primero;
		// Puntero al último elemento de la cola
		TECAP *ultimo;	
	public:
		// Constructor por defecto
		TColaABBPoro();
		// Constructor de copia
		TColaABBPoro(const TColaABBPoro &);
		// Destructor
		~TColaABBPoro();
		// Sobrecarga del operador asignación
		TColaABBPoro & operator=(const TColaABBPoro &);
		// MÉTODOS
		// Sobrecarga del operador igualdad
		bool operator==(const TColaABBPoro &);
		// Sobrecarga del operador suma
		TColaABBPoro operator+(const TColaABBPoro &);
		// Devuelve TRUE si la cola está vacía, FALSE en caso contrario
		bool EsVacia() const;
		// Inserta el elemento en la cola
		bool Encolar(TABBPoro *);
		// Elimina el primer elemento de la cola
		bool Desencolar();
		// Devuelve el primer elemento de la cola
		TABBPoro * Cabeza();
		// Devuelve la longitud de la cola
		int Longitud() const;
		// Sobrecarga del operador salida
		
		friend ostream & operator<<(ostream &,const TColaABBPoro &);
};

class TECAP{
		friend class TColaABBPoro;
	private:
		// Valor del elemento
		TABBPoro *arbol;
		// Siguiente elemento en la cola
		TECAP *sig;
	public:
		// Constructor por defecto
		TECAP();
		// Constructor de copia
		TECAP(const TECAP &);
		// Destructor
		~TECAP();
		// Sobrecarga del operador asignación
		TECAP & operator=(const TECAP &);
		
		bool operator==(const TECAP & ) const;
		
		bool operator!=(const TECAP & ) const;
		TECAP* Siguiente();
		TABBPoro* Arbol();
};

#endif
